package cn.com.zero.common.auth.security.controller;

import cn.com.zero.base.exception.ErrorCodeException;
import cn.com.zero.base.vo.ResponseVO;
import cn.com.zero.common.auth.constant.SecurityConstants;
import cn.com.zero.common.auth.security.exception.LoginFailureException;
import cn.com.zero.web.util.HttpRequestUtil;
import org.springframework.security.authentication.*;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

/**
 * @author xiongxj
 * @version 1.0.0
 * @Description 对接spring security时用于用户登录、退出操作的接口，主要用于前后端分离时使用
 * @createTime 2023/3/16 13:55
 */
@RestController
@ApiIgnore
@RequestMapping(SecurityConstants.SECURITY_CONTROLLER_PATH)
public class SecurityController {
    /**
     * 登录页面，当没有登录时跳转路径；由于系统前后端分离，所以直接返回
     */
    @RequestMapping(value = "/loginPage")
    public ResponseVO loginPage() {
        return ResponseVO.error(-80003L);
    }

    /**
     * 登录认证成功后，重定向的访问路径
     *
     * @return 返回给前端的数据
     */
    @PostMapping(value = "/loginAuthenticationSuccessHandler")
    public ResponseVO loginSuccessHandler() {
        return (ResponseVO) HttpRequestUtil.getRequest().getAttribute("loginSuccessResponse");
    }

    /**
     * 登录认证失败后，重定向的访问路径
     *
     * @return 返回给前端的数据
     */
    @PostMapping(value = "/loginAuthenticationFailureHandler")
    public ResponseVO loginFailureHandler() {
        Object authenticationException = HttpRequestUtil.getRequest().getAttribute("authenticationException");
        // 登录失败处理
        if (authenticationException != null) {
            if (authenticationException instanceof BadCredentialsException
                    || authenticationException instanceof UsernameNotFoundException) {
                // 账户名或者密码输入错误
                return ResponseVO.error(-80004L);
            }
            if (authenticationException instanceof LockedException) {
                // 账户被锁定，请联系管理员
                return ResponseVO.error(-80005L);
            }
            if (authenticationException instanceof CredentialsExpiredException) {
                // 密码过期，请联系管理员
                return ResponseVO.error(-80006L);
            }
            if (authenticationException instanceof AccountExpiredException) {
                // 账户过期，请联系管理员
                return ResponseVO.error(-80007L);
            }
            if (authenticationException instanceof DisabledException) {
                // 账户被禁用，请联系管理员
                return ResponseVO.error(-80008L);
            }
            if (authenticationException instanceof LoginFailureException) {
                Throwable cause = ((LoginFailureException) authenticationException).getCause();
                if (cause instanceof ErrorCodeException) {
                    ErrorCodeException exception = (ErrorCodeException) cause;
                    // 验证码错误等
                    return ResponseVO.error(exception.getCode(), exception.getArgs());
                }
                // 登录失败
                return ResponseVO.error(-80009L);

            }
            // 登录失败
            return ResponseVO.error(-80009L);
        } else {
            // 登录失败
            return ResponseVO.error(-80009L);
        }
    }

    @PostMapping(value = "/logoutSuccessHandler")
    public void logoutHandler() {
        // 此处暂时不做任何处理
    }

}
